import wtforms
from wtforms.validators import Email, Length, EqualTo, InputRequired
from models import UserModel, EmailCaptchaModel
from exts import db
from flask import request


# forms主要用来验证前端提供的表单数据是否正常
class RegisterForm(wtforms.Form):
    # Email() 验证器依赖于另一个 email_validator包，所以要单独安装下
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误！")])
    captcha = wtforms.StringField(validators=[Length(min=3, max=4, message="验证码格式错误！")])
    username = wtforms.StringField(validators=[Length(min=3, max=20, message="用户名格式错误！")])
    password = wtforms.StringField(validators=[Length(min=6, max=20, message="密码格式错误！")])
    # 密码确认与上面password保持一致就可以了
    password_confirm = wtforms.StringField(validators=[EqualTo("password", message="两次密码不一致！")])

    # 自定义验证：self表示forms表单对象；field：代表要验证的字段
    # 1、邮箱是否已注册验证
    def validator_email(self, field):
        # 先获取表单中输入的邮箱
        email = field.data()
        # 然后在与数据库UserModel表中已注册的邮箱做对比，判断是否存在
        user = UserModel.query.filter_by(email=email).first()
        # 最后判断返回值user是否为空
        if user:
            raise wtforms.ValidationError(message="该邮箱已经被注册！")

    # 2、验证码是否输入正确验证
    def validator_captcha(self, field):
        # 先获得 验证码 和 邮箱 (self代表整个表单对象，可以用来获取email数据，来验数据库表里是否有相的验证码和邮箱)
        captcha = field.data()
        email = self.email.data()
        # 然后从 EmailCaptchaModel表里去找是否存在，相同的 captcha 和 email，captcha_model是true表示验证通过
        # .first() 不仅加了 LIMIT 1，还把数据库返回的原始行数据转换成了一个 Python 对象（即 EmailCaptchaModel 的实例对象）
        captcha_model = EmailCaptchaModel.query.filter_by(email=email, captcha=captcha).first()
        if not captcha_model:
            raise wtforms.ValidationError(message="邮箱或验证码错误！")

        # else:
        #     # todo:可以删掉过期的captcha_model,
        #     #  1、使用下面方式验证成功后马上使用db删除：缺点影响服务器性能，影响用户体验（不推荐）
        #     #  2、可以设置一个脚本定期去数据库删除过期的captcha_model （推荐）：要先在EmailCaptchaModel表里增加一个字段：used = db.Column(db.Boolean, default=False)，然后判断字段是否使用过
        #     db.session.delete(captcha_model)
        #     db.session.commit()


class LoginFrom(wtforms.Form):
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误！")])
    password = wtforms.StringField(validators=[Length(min=6, max=12, message="密码格式错误！")])

    # def validator_username(self, field):
    #     email = field.data
    #     password = self.password.data
    #     user = UserModel.query.filter_by(email=email, password=password)
    #     if not user:
    #         raise wtforms.ValidationError(message="用户账号或密码输入有误，请重新输入！")


class QuestionForm(wtforms.Form):
    title = wtforms.StringField(validators=[Length(min=3, max=100, message="标题格式错误！")])
    content = wtforms.StringField(validators=[Length(min=3, message="内容格式错误！")])
    # create_time,author_id这两个字段不需要用户从前端页面传，create_time会自动创建，author_id自动从当前登录的用户user_id处得到


class AnswerForm(wtforms.Form):
    content = wtforms.StringField(validators=[Length(min=3, message="内容格式错误！")])
    # InputRequired
    question_id = wtforms.StringField(validators=[InputRequired(message="必须要传入问题id")])
